/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Vue;

import Controleur.AdressBook;
import Modele.Adresse;
import Modele.Contact;
import Modele.Groupe;
import Modele.Modele;
import Vue.Design.DesignFenetre;
import ecoute.Ecouteur;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * Vue.
 * Voici l'organisation de la fenetre: <br/>
 * 3 JScrollPanes accueillent chacun un composant :<br/>
 * <ul>
 * <li>A gauche une JList</li>
 * <li>Au centre une JList</li>
 * <li>A droite un JPanel au choix parmi 3 JPanels (affichage des details, edition et vide)</li>
 * </ul>
 * @author Jo
 */
public final class Fenetre extends javax.swing.JFrame 
        implements ecoute.Ecouteur{
    
    private JButton bouton_modeEdition, bouton_plusContact, bouton_plusGroupe;
    private JButton bouton_moinsGroupe, bouton_moinsContact, bouton_save, bouton_annuler;
    JButton bouton_triAZ_groupes, bouton_triZA_groupes, bouton_triAZ_contacts;
    public JList jList_contacts, jList_groupes;
    public JScrollPane jScrollPane_contacts, jScrollPane_droite, jScrollPane_groupes;
    
    public JPanel panneauPrincipal;
    public PanelDetails panelDetails;
    public PanelEdition panelEdition;
    
    /**
     * La vue connait le controleur, afin d'en appeler des fonctions lors de clics sur des boutons.
     */
    AdressBook controleur;
    
    /**
     * Constructeur Fenetre.
     */
    public Fenetre(Modele modeleParam, final AdressBook controleur) {
        super();
        
        this.controleur = controleur;
        
        initComponentsManuellement();
        
        jList_groupes.setModel(modeleParam);
        jList_contacts.setModel(new DefaultListModel());
        boutonsContactsSetEnabled(false);
        
        jList_contacts.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                System.out.println(jList_contacts.getSelectedIndex());
                //if(!e.getValueIsAdjusting()){
                    if(jList_contacts.getSelectedIndex() <0){
                        boutonsContactsSetEnabled(false);
                    }
                    else{
                        boutonsContactsSetEnabled(true);
                    }
                //}
            }
        });
        
        
        /*
         * Actions sur les boutons
         */
        bouton_plusGroupe.addActionListener(new java.awt.event.ActionListener() {
            @Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                controleur.ajoutGroupeActionPerformed(-1);
                
            }
        });
        bouton_plusContact.addActionListener(new java.awt.event.ActionListener() {
            @Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                controleur.ajoutContactActionPerformed(evt, jList_groupes.getSelectedIndex());
            }
        });
        bouton_moinsGroupe.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                controleur.modele.supprimerGroupe(jList_groupes.getSelectedIndex());
            }
        });
        bouton_moinsContact.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(jList_contacts.getSelectedIndex()<0){
                    return;
                }
                controleur.modele.supprimerContact(jList_contacts.getSelectedIndex(), jList_groupes.getSelectedIndex());
            }
        });
        bouton_modeEdition.addActionListener(new java.awt.event.ActionListener() {
            @Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                updatePanelEdition();
            }
        });
        bouton_annuler.addActionListener(new java.awt.event.ActionListener() {
            @Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                updatePanelDetails();
            }
        });
        bouton_save.addActionListener(new java.awt.event.ActionListener() {
            @Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println("nouveauCheminIcone : " + panelEdition.nouveauCheminIcone);
                
                Contact c = new Contact(panelEdition.nouveauCheminIcone, panelEdition.getNom(), panelEdition.getPrenom(), 
                            new Adresse(), new Adresse(), 
                            panelEdition.getTelMobile(), panelEdition.getTelMaison(), panelEdition.getTelBureau(), 
                            panelEdition.getSiteWeb(), panelEdition.getEmail());
                controleur.modifierContact(jList_groupes.getSelectedIndex(), jList_contacts.getSelectedIndex(), c);
            }
        });
        
        
        /*
         * Actions sur les boutons de tri
         */
        bouton_triAZ_groupes.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if( jList_groupes.getModel() instanceof Modele ) {
                    ((Modele) jList_groupes.getModel()).sort_AZ();
                }
            }
        });
        bouton_triZA_groupes.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if( jList_groupes.getModel() instanceof Modele ) {
                    ((Modele) jList_groupes.getModel()).sort_ZA();
                }
            }
        });
        bouton_triAZ_contacts.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if( jList_contacts.getModel() instanceof Groupe ) {
                    ((Groupe) jList_contacts.getModel()).sort_AZ();
                }
            }
        });
        
        
        /*
         * Actions sur les listes
         */
        this.jList_groupes.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override public void mouseClicked(java.awt.event.MouseEvent evt) {
                //Afficher les contacts du groupe
                updateModelContacts();
                boutonsContactsSetEnabled(true);
                updatePanelNothing();
            }
        });
        this.jList_contacts.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override public void mouseClicked(java.awt.event.MouseEvent evt) {
                
                updatePanelDetails();
                //controleur.afficherDetails( jList_contacts.locationToIndex(evt.getPoint()) );
                
            }
        });
        
        pack();
        
        DesignFenetre.designer(this);
    }
    
    /**
     * Defini le modele de la jList_contacts en fonction de la selection de jList_groupes.
     */
    public void updateModelContacts(){
        jList_contacts.setModel( ((ListModel)
                        jList_groupes.getModel().getElementAt(
                            //jList_groupes.locationToIndex(evt.getPoint())
                            jList_groupes.getSelectedIndex()
                        ) )
                        );
    }                 
    
    /**
     * Creation des composants et assemblage.
     */
    private void initComponentsManuellement() {
        panneauPrincipal = new JPanel();
        bouton_plusGroupe = new JButton("+");
        bouton_plusContact = new JButton("+");
        bouton_modeEdition = new JButton("Modifier");
        bouton_save = new JButton("Enregistrer");
        bouton_annuler = new JButton("Annuler");
        bouton_moinsGroupe = new JButton("-");
        bouton_moinsContact = new JButton("-");
        bouton_triAZ_groupes = new JButton("A/Z");
        bouton_triZA_groupes = new JButton("Z/A");
        bouton_triAZ_contacts = new JButton("A/Z");
        panelDetails = new PanelDetails();
        panelEdition = new PanelEdition();
        
        jScrollPane_groupes = new JScrollPane();
        jList_groupes = new JList();
        jScrollPane_contacts = new JScrollPane();
        jList_contacts = new JList();
        jScrollPane_droite = new JScrollPane();
        
        
        setSize(900, 340);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Adress Book");
        setResizable(false);
        setLocationRelativeTo(null);
        setContentPane(panneauPrincipal);
        
        jScrollPane_groupes.setViewportView(jList_groupes);
        jScrollPane_contacts.setViewportView(jList_contacts);
        //jScrollPane_droite.setViewportView(panelDetails);
        updatePanelNothing();
        
        //Creation des tiers
        JPanel panelGroupes = creerPanelAvec(jScrollPane_groupes, new JButton[]{bouton_plusGroupe, bouton_moinsGroupe, bouton_triAZ_groupes, bouton_triZA_groupes}, ComponentOrientation.LEFT_TO_RIGHT);
        JPanel panelContacts = creerPanelAvec(jScrollPane_contacts, new JButton[]{bouton_plusContact, bouton_moinsContact, bouton_triAZ_contacts}, ComponentOrientation.LEFT_TO_RIGHT);
        JPanel panelDroite = creerPanelAvec(jScrollPane_droite, new JButton[]{bouton_modeEdition, bouton_annuler, bouton_save}, ComponentOrientation.RIGHT_TO_LEFT);
        
        //Pour design
        jScrollPane_droite.setOpaque(false);
        jScrollPane_droite.getViewport().setOpaque(false);
        panelDetails.setOpaque(false);
        panelEdition.setOpaque(false);
        
        //Ajout des tiers
        panneauPrincipal.setLayout(new BorderLayout());
        panneauPrincipal.add(panelGroupes, BorderLayout.LINE_START);
        panneauPrincipal.add(panelContacts, BorderLayout.CENTER);
        panneauPrincipal.add(panelDroite, BorderLayout.LINE_END);
        
        //jPanel1.setBackground(new java.awt.Color(245, 245, 245));
        //jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 102, 153)));
        
    }
    
    /**
     * Assemble un tiers de la fenetre.
     * @param jScrollPane Tiers
     * @param boutons Boutons associes
     * @param orientationBoutons
     * @return Panneau assemble.
     */
    public JPanel creerPanelAvec(JScrollPane jScrollPane, JButton[] boutons, ComponentOrientation orientationBoutons){
        jScrollPane.setOpaque(false);
        
        JPanel panelTiers = new JPanel();
        panelTiers.setLayout(new BorderLayout());
        panelTiers.setPreferredSize(new Dimension(this.getWidth()/3, this.getHeight()));
        panelTiers.setOpaque(false);
        
        JPanel panBoutons = new JPanel();
        panBoutons.setLayout(new BoxLayout(panBoutons, BoxLayout.LINE_AXIS));
        panBoutons.setComponentOrientation(orientationBoutons);
        panBoutons.setOpaque(false);
        for (JButton bouton : boutons) {
            panBoutons.add(bouton);
        }
        
        panelTiers.add(jScrollPane, BorderLayout.CENTER);
        panelTiers.add(panBoutons, BorderLayout.PAGE_END);
        
        return panelTiers;
    }
    
    private void boutonsContactsSetEnabled(boolean actived){
        bouton_plusContact.setEnabled(actived);
        bouton_moinsContact.setEnabled(actived);
    }
    
    /**
     * Met le panel de details dans le tiers droit de la fenetre.
     * @see PanelDetails
     */
    public void updatePanelDetails(){
        if(jList_contacts.getModel()instanceof DefaultListModel) {
            System.out.println("instanceof DefaultListModel");
            return;
        }
        else if(jList_contacts.getModel()instanceof Groupe) {
            System.out.println("instanceof Groupe");
        }
        
        jScrollPane_droite.setViewportView(panelDetails);
        
        //TODO mettre contact dans actionPerformed?
        Contact c = ((Groupe) jList_contacts.getModel()).contacts.get(jList_contacts.getSelectedIndex());
        //c = (Contact) jList_contacts.getModel().getElementAt(selectedIndex);
        panelDetails.updateValeurs(c, false);
        
        bouton_modeEdition.setEnabled(true);
        bouton_modeEdition.setVisible(true);
        
        bouton_annuler.setVisible(false);
        bouton_save.setVisible(false);
    }
    
    /**
     * Met le panel d'edition dans le tiers droit de la fenetre.
     * @see PanelEdition
     */
    public void updatePanelEdition(){
        jScrollPane_droite.setViewportView(panelEdition);
        
        Contact c = ((Groupe) jList_contacts.getModel()).contacts.get(jList_contacts.getSelectedIndex());
        panelEdition.updateValeurs(c, true);
        panelEdition.nouveauCheminIcone = c.cheminPhoto;
        
        ((JTextField) panelEdition.labelNom).requestFocus();
        //this.getRootPane().setDefaultButton(bouton_save);
        
        bouton_modeEdition.setVisible(false);
        
        bouton_annuler.setVisible(true);
        bouton_save.setVisible(true);
    }
    
    /**
     * Met un panel vide dans le tiers droit de la fenetre.
     * Affiche "Selectionnez un contact".
     */
    public void updatePanelNothing(){
        JPanel panelVide = new JPanel();
        panelVide.add(Box.createRigidArea(new Dimension(0,100)));
        JLabel l = new JLabel("← Selectionnez un contact");
        l.setForeground(DesignFenetre.labelIntituleColor);
        panelVide.add(l);
        panelVide.setOpaque(false);
        jScrollPane_droite.setViewportView(panelVide);
        
        
        bouton_modeEdition.setEnabled(false);
        bouton_modeEdition.setVisible(true);
        
        bouton_annuler.setVisible(false);
        bouton_save.setVisible(false);
    }
    
    
    @Override
    public void actualiserListes(int evenement) {
        repaint();
        switch(evenement){
            case Ecouteur.AJOUT_GROUPE:
                System.out.println("actualiserListeGroupes : AJOUT_GROUPE");
                jList_groupes.setSelectedIndex(jList_groupes.getModel().getSize()-1);
                updateModelContacts();
                boutonsContactsSetEnabled(true);
                break;
                
            case Ecouteur.SUPPR_GROUPE:
                System.out.println("actualiserListeGroupes : SUPPR_GROUPE");
                jList_contacts.setModel(new DefaultListModel());
                break;
                
            case Ecouteur.AJOUT_CONTACT:
                System.out.println("actualiserListeContacts : AJOUT_CONTACT");
                //jList_contacts.updateUI();
                jList_contacts.setSelectedIndex(jList_contacts.getModel().getSize()-1);
                updatePanelDetails();
                updatePanelEdition();
                ((JTextField) panelEdition.labelNom).selectAll();
                break;
                
            case Ecouteur.MODIF_CONTACT:
                System.out.println("actualiserListeContacts : MODIF_CONTACT");
                updatePanelDetails();
                break;
                
            case Ecouteur.SUPPR_CONTACT:
                System.out.println("actualiserListeContacts : SUPPR_CONTACT");
                updatePanelNothing();
                break;
                
            case Ecouteur.TRI_GROUPES:
                //jList_groupes.setSelectedIndex(-1);
                jList_contacts.setModel(new DefaultListModel());
                break;
                
            case Ecouteur.TRI_CONTACTS:
                updateModelContacts();//pour deselectionner
                updatePanelNothing();
                break;
                
            default:
                System.out.println("WARNING");
        }
    }
    
    
    
    //---DESIGN---
    
    public int x_droite=589;//this.getWidth()//589 si fenetre
    public int y=268+38;//274
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        /*int largeur = 25;
        int p1[] = {x_droite-largeur, y};
        int p2[] = {x_droite, y};
        int p3[] = {x_droite, y-largeur};
        
        int xp[] = {p1[0], p2[0], p3[0]};
        int yp[] = {p1[1], p2[1], p3[1]};
        
        g.setColor(this.getContentPane().getBackground());
        g.fillPolygon(xp, yp, 3);*/
    }
    
}
